package com.sxj.corejava.code07_面向对象.封装;

/**
 * @author 石小俊
 * @date 2024年03月16日 10:30
 */
public class Poker {
    private Card[] cards;

    public Card[] getCards() {
        return cards;
    }

    public void setCards(Card[] cards) {
        this.cards = cards;
    }

    public Poker() {
        // 为一副牌填充54张牌
        // 即:创建对象时为cards属性赋值
        // 其值为54个Card对象,分别对应四种花色的A-K以及大小王
        cards = new Card[54];
        // 定义花色的范围
        String[] colors = {"红桃", "黑桃", "方块", "梅花"};
        // 定义点数的范围
        String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        // 花色与点数的每一种组合即为一张牌
        // 定义cards的初始下标
        int index = 0;
        // 通过双重for循环进行每一张牌的组合
        // 外层循环控制花色
        for (int i = 0; i < colors.length; i++) {
            // 内层循环控制点数
            for (int j = 0; j < nums.length; j++) {
                cards[index++] = new Card(colors[i], nums[j]);
            }
        }
        // 除了上述的52张牌意外还有大小王
        cards[index++] = new Card("大", "王");
        cards[index++] = new Card("小", "王");
    }

    /**
     * 洗牌方法,每次调用该方法,会将一副牌的顺序全部打乱
     * 即:随机重组54张牌
     */
    public void shuffle() {
        // 定义一个相同长度、相同类型的数组,用于存储洗牌后的数据
        Card[] cards = new Card[54];
        // 为洗牌后的数组元素赋值,其值取自于未洗牌前是数组
        for (int i = 0; i < cards.length; i++) {
            // 从一副牌中随机取出一张牌
            // 因为未洗牌前的数组中存在完整的一副牌,共有54张牌
            // 那么通过数组下标进行获取时,取下标为0-53的元素
            // 随机生成一个0-53的整数
            int index = (int) (Math.random() * 54);
            Card card = this.cards[index];

            // 判断这张牌是否有效
            // 当取出来的牌为null时,说明该下标的牌已经被取出了
            while (card == null) {
                // 重新取出一张牌
                index = (int) (Math.random() * 54);
                // 取出来的牌仍然需要进行判断,判断取出的这张牌是否有效
                card = this.cards[index];
            }

            // 当取出来的牌有效时,将其赋值给洗牌后的数组
            cards[i] = card;

            // 想要不取出重复的牌,可以在原数组中去除被取出来的这张牌
            this.cards[index] = null;
        }
        // 将洗牌后的数据赋值给原来的数组
        this.cards = cards;
    }

}
